草庐IT

MIPS 指令

全部标签

c++ - 最快的 stride-3 收集指令序列是什么?

问题:从内存中生成32位元素的stride-3集合的最有效序列是什么?如果内存排列为:MEM=R0G0B0R1G1B1R2G2B2R3G3B3...我们要获得三个YMM寄存器,其中:YMM0=R0R1R2R3R4R5R6R7YMM1=G0G1G2G3G4G5G6G7YMM2=B0B1B2B3B4B5B6B7动机和讨论标量C代码类似于templateTProcess(constT*Input){TResult=0;for(inti=0;i(R,G,B);}returnResult;}假设some_parallelizable_algorithm是用内在函数编写的,并已调整为尽可能快的实现

C++ 前向声明 using 指令

我有一个通过using公开模板类和typedef的header,例如:namespacefancy{structBar{...}templateclassFoo{...}usingFooBar=Foo;}我想转发声明FooBar以在另一个header中的shared_ptr中使用它。我试过了namespacefancy{usingFooBar;}喜欢一个类或结构,但没有运气。这可能吗?如果可以,怎么做? 最佳答案 你不能声明一个using别名而不定义它。但是,您可以在不定义类模板的情况下声明它,并使用重复的using别名:names

c++ - 用于查找不匹配的大括号/预处理器指令的提示和工具

这是我最害怕的C/C++编译器错误之一:file.cpp(3124):fatalerrorC1004:unexpectedend-of-filefoundfile.cpp包含近百个头文件,而这些头文件又包含其他头文件。超过3000行。代码应该模块化和结构化,源文件更小。我们应该重构它。作为程序员,总是有一个改进的愿望list。但现在,代码一团糟,最后期限也快到了。Somewhere在所有这些行中——很可能在包含的头文件之一中,而不是在源文件本身中——显然有一个不匹配的大括号、不匹配的#ifdef或类似的。问题是,当缺少某些东西时,编译器无法真正告诉我它在哪里丢失了。它只知道当它到达文件

c++ - 可以将标准的纯 C header #include 指令放在命名空间中吗?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Isitagoodideatowrapan#includeinanamespaceblock?我有一个类log的项目在全局命名空间(::log)中。所以,很自然地,在#include之后,每次我尝试实例化日志类的对象时,编译器都会给出一条错误消息,因为用许多三字母方法污染全局命名空间,其中之一是对数函数log().所以有三种可能的解决方案,每一种都有其独特的丑陋副作用。将日志类移动到它自己的命名空间,并始终使用它的完全限定名称访问它。我真的想避免这种情况,因为记录器应该尽可能方便使用。写一个mathwrapp

c++ - 如何在 Visual Studio 2008 中启用 SSE/SSE2 指令集(使用 CMake)?

在VisualStudio2005中,我进入了:查看-->属性页-->C/C++-->代码生成-->启用增强指令集但在VisualStudio2008中?提前致谢 最佳答案 如果您正在寻找SSE/SSE2:Project>Properties>ConfigurationProperties>C/C++>CodeGeneration>EnableEnhancedInstructionSet,或附加/arch:SSE(或/arch:SSE2)在CommandLine>AdditionalOptions.不过,您需要有一个原生项目,并至少

c++ - 如何在 GCC 中使用 pragma 指令禁用所有警告

我正在寻找一种方法来抑制所有可能的警告,这些警告可能是我在Gcc中使用pragma指令获得的。我制作了一些守卫宏来帮助我从警告中消除第3方header,现在它们就像msvc和clang的魅力一样。我仍然缺少使用Gcc诊断编译指示的正确方法来抑制部分中的每个警告。让我举几个例子:在msvc中我们可以这样做:#pragmawarning(push,0)//Codethatproduceswarnings...#pragmawarning(pop)在clang中我们可以这样做:#pragmaclangdiagnosticpush#pragmaclangdiagnosticignored"-W

c++ - 如何在 C++ 中编写指令缓存友好的程序?

最近HerbSutter在"ModernC++:WhatYouNeedtoKnow"上做了一场精彩的演讲.本次演讲的主题是效率以及数据局部性和访问内存的重要性。他还解释了CPU将如何喜欢内存(数组/vector)的线性访问。他从另一部经典引用文献中举了一个例子"GameperformancebyBobNystrom"关于这个话题。阅读这些文章后,我了解到影响程序性能的缓存有两种类型:数据缓存指令缓存Cachegrind该工具还测量我们程序的缓存类型检测信息。许多文章/博客已经解释了第一点以及如何实现良好的数据缓存效率(数据局部性)。但是我没有得到太多关于主题指令缓存的信息,以及在我们的

c++ - CPU 松弛指令和 C++11 原语

我注意到许多无锁算法使用特定于操作系统的原语实现,例如描述的自旋锁here(使用Linux特定的原子原语)经常使用“cpu放松”指令。使用GCC,可以通过以下方式实现:asmvolatile("pause\n":::"memory");具体来说,该指令常用于while循环自旋锁的主体中,同时等待变量设置为某个值。C++11似乎没有提供任何可移植的“cpu_relax”类型指令。这有什么原因吗?“暂停”语句真的有什么用处吗?编辑:另外,我想问:为什么C++11标准委员会不决定包含一个通用的std::cpu_relax()或其他什么?便携性是不是太难保证了? 最

c++ - Clang 产生 GCC 不产生的非法指令

我发现Clang产生非法指令的情况,而gcc没有,在尝试this时问题。我的问题是:我做错了什么,还是Clang的实际问题?我将其归结为重现问题所需的最小片段。获取文件eigen.cpp:#include#defineEIGEN_MATRIXBASE_PLUGIN"eigen_matrix_addons.hpp"#includeintmain(){Eigen::Matrix2dA;A还有文件eigen_matrix_addons.hpp:friendstd::ostream&operator&>(m);}(参见here了解该文件的详细说明。简而言之,它的内容直接放在templatecl

c++ - 是否有 GCC 预处理器指令来检查代码是否在 64 位机器上编译?

我正在尝试执行以下操作;#ifdef64-bit#defineDECIMAL_FORMAT%ld#else#defineDECIMAL_FORMAT%d#endif.intptr_td;.printf(“SomemessagewithDECIMAL_FORMATinthemiddleofit\n”,d);类型为“intptr_t”的变量“d”在32位机器上需要“%d”格式说明符,在64位机器上需要格式说明符“%ld”。我正在寻找一种能够在不更改GCC命令行或源代码的情况下在32位机器和64位机器上编译代码的解决方案。 最佳答案 我认